home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 31
/
Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso
/
Aminet
/
dev
/
c
/
vbccppcsrc.lha
/
vbcc
/
ar
/
files.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-07
|
3KB
|
107 lines
/* $VER: ar files.c V0.1 (31.01.98)
*
* This file is part of ar, a portable archive maintanance
* utility for normal and BSD-style archives.
* Copyright (c) 1999 Frank Wille
*
* ar is freeware and part of the portable and retargetable ANSI C
* compiler vbcc, copyright (c) 1995-99 by Volker Barthelmann.
* ar may be freely redistributed as long as no modifications are
* made and nothing is charged for it. Non-commercial usage is allowed
* without any restrictions.
* EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
* SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
*
*
* v0.1 (31.01.99) phx
* First working version, which only supports 'q' (quick append)
* and 't' (table of contents), reads and writes normals and
* BSD-style archives. Symbol table will not be created!
* v0.0 (30.01.99) phx
* File created.
*/
#ifdef AMIGA
#include <dos/dos.h>
#include <proto/dos.h>
#define UNIXOFFSET 252457200 /* seconds from 1.1.70 to 1.1.78 */
#else /* UNIX */
#include <sys/types.h>
#include <sys/stat.h>
#endif
#include <string.h>
#include "ar.h"
#include "archive.h"
#ifdef AMIGA
void getfstat(struct ArObject *obj,char *name)
/* Amiga version */
{
BPTR lock;
static struct FileInfoBlock fib;
/* ^^ must be longword aligned - vbcc guarantees that */
if (lock = Lock(name,ACCESS_READ)) {
if (Examine(lock,&fib)) {
uint16 m = 0;
uint32 p;
obj->time = UNIXOFFSET+(uint32)(fib.fib_Date.ds_Days*(60*60*24) +
fib.fib_Date.ds_Minute*60 +
fib.fib_Date.ds_Tick/TICKS_PER_SECOND);
obj->uid = fib.fib_OwnerUID;
obj->gid = fib.fib_OwnerGID;
p = fib.fib_Protection;
if (!(p & FIBF_READ)) m |= 0400;
if (!(p & FIBF_WRITE)) m |= 0200;
if (!(p & FIBF_EXECUTE)) m |= 0100;
if (p & FIBF_GRP_READ) m |= 0040;
if (p & FIBF_GRP_WRITE) m |= 0020;
if (p & FIBF_GRP_EXECUTE) m |= 0010;
if (p & FIBF_OTR_READ) m |= 0004;
if (p & FIBF_OTR_WRITE) m |= 0002;
if (p & FIBF_OTR_EXECUTE) m |= 0001;
obj->mode = m;
}
UnLock(lock);
}
}
char *filepart(char *path)
/* Amiga version */
{
return ((char *)FilePart((STRPTR)path));
}
#else
void getfstat(struct ArObject *obj,char *name)
/* Unix version */
{
struct stat sb;
if (!stat(name,&sb)) {
obj->time = (uint32)sb.st_mtime;
obj->uid = (uint16)sb.st_uid;
obj->gid = (uint16)sb.st_gid;
obj->mode = (uint16)sb.st_mode;
}
}
char *filepart(char *path)
/* Unix version */
{
char *ind;
return ((ind = strrchr(path, '/')) ? ind + 1 : path);
}
#endif